#include <stdio.h>
#include "app.h"
#include "driver/adc.h"


extern tSys_Flag Sys_Flag;
extern tSys_Status Sys_Status;

#define TIMER_DIVIDER         80  // 硬件定时器分频器
#define TIMER_BASE_CLK         80000000  // APB系统时钟， 160M / 2 
#define TIMER_SCALE           ( TIMER_BASE_CLK/ TIMER_DIVIDER / 1000000 )  // 转换为uS 
#define TIMER_INTERVAL_SEC    1000 * 1  // 定时器间隔(uS秒) 

// 定时器组1，定时器0
#define TIMER_GROUP TIMER_GROUP_1
#define TIMER_NUM TIMER_0

static gptimer_handle_t gptimer = NULL; // 定时器句柄
static const char *TAG = "GPTimer";

// 定时器中断回调函数（新版签名）
static bool IRAM_ATTR timer_group_isr_callback(gptimer_handle_t timer, const gptimer_alarm_event_data_t *edata, void *user_ctx) {
    // 在这里处理定时器事件（无需手动清除中断状态）
    Sys_Status.Time1_Cont++;
    Sys_Status.Current_Value = read_adc_value();

    // 中断安全的日志输出（注意：高频日志仍可能导致问题）
    // ESP_DRAM_LOGI(TAG, "Count: %d, ADC: %d", (int)Sys_Status.Time1_Cont, Sys_Status.Current_Value);

    return true; // 返回true表示需要唤醒高优先级任务
}

void Init_HW_Timer_1() {
    // 1. 配置定时器
    gptimer_config_t timer_config = {
        .clk_src = GPTIMER_CLK_SRC_DEFAULT, // 默认时钟源（通常80MHz）
        .direction = GPTIMER_COUNT_UP,      // 递增计数
        .resolution_hz = TIMER_SCALE,       // 分辨率（与旧版divider等效）
    };
    ESP_ERROR_CHECK(gptimer_new_timer(&timer_config, &gptimer));

    // 2. 设置报警事件和回调
    gptimer_event_callbacks_t cbs = {
        .on_alarm = timer_group_isr_callback, // 注册中断回调
    };
    ESP_ERROR_CHECK(gptimer_register_event_callbacks(gptimer, &cbs, NULL));

    // 3. 设置报警值（自动重载）
    gptimer_alarm_config_t alarm_config = {
        .alarm_count = TIMER_INTERVAL_SEC * TIMER_SCALE, // 触发周期
        .reload_count = 0, // 自动重载（相当于旧版auto_reload）
    };
    ESP_ERROR_CHECK(gptimer_set_alarm_action(gptimer, &alarm_config));

    // 4. 启动定时器
    ESP_ERROR_CHECK(gptimer_enable(gptimer));
    ESP_ERROR_CHECK(gptimer_start(gptimer));

    ESP_LOGI(TAG, "Timer initialized (Interval: %d ticks)", TIMER_INTERVAL_SEC * TIMER_SCALE);
}

// 停止并释放定时器
void Timer_Deinit() {
    if (gptimer) {
        gptimer_stop(gptimer);
        gptimer_disable(gptimer);
        gptimer_del_timer(gptimer);
        gptimer = NULL;
    }
}